Amazon Redshift Concurrency Scalingを無停止で有効化/無効化する方法を検証してみた

Amazon Redshift Concurrency Scalingを無停止で有効化/無効化する方法を検証してみた

Clock Icon2024.10.22

こんにちは、石川覚(@いしかわん)です。

皆さんは Amazon Redshift Concurrency Scalingを無停止で有効化/無効化したいなと思ったことはありますか? 私はあります。

今日も調子に乗って、「のんピ(@non97)」さん構文 で挨拶しました。(のんピさんのブログはコチラです!)

改めまして、AWS事業本部コンサルティング部の石川です。今日はAmazon Redshift Concurrency Scalingを無停止で有効化/無効化する方法、実際にそれぞれ検証しました。

最初に結論

方式2で無停止で有効化/無効化できました。

  • 無停止で無効化したい場合は、"concurrency_scaling"を"off"に設定する
  • 無停止で有効化したい場合は、"concurrency_scaling"を"auto"に設定する

なぜ、無停止で有効化/無効化したいと思ったのか

データウェアハウスに対してクエリが時間帯や曜日によって、スパイクアクセスすることがあります。そんなときに有効なのがConcurrency Scalingです。Concurrency Scalingを有効に設定しておけば、リクエストに応じて読み書きともに自動的にスケールアウト/スケールインします。しかし、コストのことも考えるとConcurrency Scalingをここぞという特定の曜日や時間帯に限定して有効にしたい要望をいただきました。

そうなると、一般の利用者に悪影響がないように無停止で有効化/無効化する方法がないかと考えたわけです。

有効化/無効化する方法の検討

下記の設定変更には、AWSCLIを用いて動的に設定を変更する前提です。

方法1: スケーリングクラスタの台数を0から1に変更する

具体的には、max_concurrency_scaling_clustersパラメータのParameterValueを"1"から"0"に変更する方式です。この方式のメリットは、"2"から"1"のような応用の可能性があることです。

※ 補足: スケーリングクラスタとは、Concurrency Scalingによって自動起動されたクラスタのことを呼びます。対して、元々あるクラスタのことをメインクラスタと呼びます。

方式2: Concurrency Scalingの機能を有効化/無効化する

具体的には、"concurrency_scaling"を"auto"から"off"に変更する方式です。

検証環境

  • dc2.largeの2ノードクラスタ
  • Concurrency Scalingの機能を有効化
  • スケーリングクラスタの台数を1設定
  • WLMは、ManualWLM、最大同時実行数は「5」に設定

クラスタは以下のように構築しました。

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-2

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-3

WLMの設定は以下のとおりです。

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-1

負荷試験ツール

負荷試験ツールは、先日ご紹介した簡易負荷試験ツールを用いています。ソースや使い方は、下記のブログを参考にしてください。

https://dev.classmethod.jp/articles/20241016-amazon-redshift-stress-buster/

このツールで負荷をかけて、Concurrency Scalingを発動させています。実際にはSQLを大量に作るのが大変なため、6つのSQLだけ作成して、それを大量に投入して実行するように1行だけ追加しています。

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-4

では検証していきましょう。

初期状態: Concurrency Scaling が1つ起動している状態

グラフのそれぞれ右側をご覧ください。常に過負荷な状態が続き、Concurrency Scaling が1つ起動しています。以降では、この状態のクラスタに対して、方式1と方式2で変更を加えます。

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-5

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-6

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-7

方法1: スケーリングクラスタの台数を0から1に変更する

スケーリングクラスタの台数を0から1に変更するため、以下のコマンドを実行しました。以下の通り、max_concurrency_scaling_clustersパラメータのParameterValueを"1"から"0"に変更すると、dynamic(動的)に変更できるパラメタではないため、エラーになってしまいました。失敗です。

$ aws redshift modify-cluster-parameter-group --parameter-group-name cs --parameters ParameterName=max_concurrency_scaling_clusters,ParameterValue=0,ApplyType=dynamic

An error occurred (InvalidParameterValue) when calling the ModifyClusterParameterGroup operation: 'dynamic' is not a valid apply type for parameter max_concurrency_scaling_clusters.

方式2: Concurrency Scalingの機能を有効化/無効化する

Concurrency Scalingの機能を無効化の確認

Concurrency Scalingの機能を無効化には、"concurrency_scaling"を"auto"から"off"に変更します。WLMの設定(wlm_json_configuration)である、jsonをエンコードした文字列引数に指定します。コマンドが成功しました。無効化されるとすぐにクエリの処理スピードが遅くなりました。その理由は、設定が無効化されたことによって、メインクラスタからスケーリングクラスタへのオフロードが止まったためと考えられます。

$ aws redshift modify-cluster-parameter-group \
>   --parameter-group-name cs \
>   --parameters '[{"ParameterName":"wlm_json_configuration","ParameterValue":"[{\"user_group\":[],\"query_group\":[],\"user_role\":[],\"name\":\"Default queue\",\"query_concurrency\":5,\"concurrency_scaling\":\"off\"},{\"auto_wlm\":false},{\"short_query_queue\":false}]"}]'
{
    "ParameterGroupName": "cs",
    "ParameterGroupStatus": "Your parameter group has been updated. If you changed only dynamic parameters, associated clusters are being modified now. If you changed static parameters, all updates, including dynamic parameters, will be applied when you reboot the associated clusters."
}

マネジメントコンソールから、WLMの設定を確認したところ"concurrency_scaling"が"off"に設定されている事を確認できました。

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-8

スケーリングクラスタの状態を確認すると、「同時実行スケーリングアクティビティ」がガクンと下がったことが確認できます。

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-9

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-10

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-11

Concurrency Scalingの機能を有効化の確認

再び、Concurrency Scalingの機能を有効化するには、"concurrency_scaling"を"off"から"auto"に変更します。WLMの設定(wlm_json_configuration)である、jsonをエンコードした文字列引数に指定します。コマンドが成功しました。有効化されると1分程度でクエリの処理スピードが速くなりました。その理由は、設定が有効化されることによって、スケーリングクラスタが自動起動して、メインクラスタからスケーリングクラスタへのオフロードが再開したためと考えられます。

$ aws redshift modify-cluster-parameter-group \
>   --parameter-group-name cs \
>   --parameters '[{"ParameterName":"wlm_json_configuration","ParameterValue":"[{\"user_group\":[],\"query_group\":[],\"user_role\":[],\"name\":\"Default queue\",\"query_concurrency\":5,\"concurrency_scaling\":\"auto\"},{\"auto_wlm\":false},{\"short_query_queue\":false}]"}]'
{
    "ParameterGroupName": "cs",
    "ParameterGroupStatus": "Your parameter group has been updated. If you changed only dynamic parameters, associated clusters are being modified now. If you changed static parameters, all updates, including dynamic parameters, will be applied when you reboot the associated clusters."
}

マネジメントコンソールから、WLMの設定を確認したところ"concurrency_scaling"が"auto"に設定されている事を確認できました。

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-12

スケーリングクラスタの状態を確認すると、「同時実行スケーリングアクティビティ」がグッと上がったことが確認できます。

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-13

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-14

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-15

Concurrency Scalingの機能を有効化/無効化が無停止だったのか?

有効化から無効化へ、無効化から有効化へ、それぞれ負荷試験のログを取得していました。ともにエラーはありませんでした。つまり、無停止でスケールイン、スケールアウトができたということです。

20241022-amazon-redshift-how-to-disable-cs-woithout-downtime-16

最後に

第1希望だったスケーリングクラスタの台数を0から1に変更する方式1が実現できなかったのは残念ですが、方式2で有効化/無効化が無停止で実現できたことが確認できて安心しました。

方式1でエラーになったときに指定していたApplyType=dynamicについて解説します。WLMの設定には、再起動なしで適用可能なDynamic(動的)パラメータと、再起動が必要なStatic(静的)パラメータがあります。方式2はDynamicパラメータであるため適用可能でした。

本記事では、Amazon Redshift Concurrency Scalingを無停止で有効化/無効化する方法について検証しました。この知見を活用することで、ビジネスニーズに合わせて柔軟にConcurrency Scalingを制御し、パフォーマンスとコストの最適なバランスを取ることができます。データウェアハウスの運用において、このような細やかな制御が可能であることは、効率的なリソース管理とコスト最適化につながります。ぜひ、皆様の環境でも試してみてください。Redshiftの可能性をさらに広げ、データ分析基盤としての価値を最大限に引き出すことができるでしょう。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.